草庐IT

Goroutines、 channel 和死锁

全部标签

go - 从 goroutine 中的缓冲 channel 读取时的执行顺序

我在研究并发和缓冲channel时遇到了以下让我感到困惑的问题:https://play.golang.org/p/wir7wP2u-yf为什么函数echo中channel(大小为3)的“卸载”会发生在包含4的情况下?为什么5发送到channelc后,channel容量一直为0?为什么没有回显10?packagemainimport"fmt"funcecho(cchanint){fornum:=rangec{//fmt.Printf("lengthofchannelc:%v\n",len(c))fmt.Println(num)}fmt.Println("Doneiterating")}

Golang Channel 收不到消息

我尝试探索gochannel,我创建的channelbuffermax10,gomaxprocess是2,但我想知道为什么这段代码收不到消息runtime.GOMAXPROCS(2)messages:=make(chanint,9)gofunc(){for{i:= 最佳答案 您的案例类似于this,虽然它可能在某些时候看起来有效,但不能保证总是有效。只是添加一些上下文,在无缓冲channel中,发送go例程在尝试发送值时被阻塞,并且保证在发送go例程被唤醒(在本例中为main)之前发生接收,所以在这种情况下,这似乎是一个可行的选择。

Goroutines 和 mutex

关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭4年前。Improvethisquestionfunc(s*Server)start(){s.Lock()defers.Unlock()if!s.isClosed{gos.processing()}gos.start()}func(s*Server)processing(){s.Lock()//dostuffs.Unlock()}我有一个工作的Golang项目,其中有一段代码遵循上面显示的逻辑。我不明白为什么这个逻辑像我预料的那样会出现死锁。

go - 所有goroutine都处于 sleep 状态-死锁(无限循环+选择)

我有一个应用程序,每隔几秒钟就创建一个从api获取当前价格的例程。然后它将响应发送到监视例程以进行分析。如果监视器发现价格有明显变化,它会发送一个通知。如果每次执行程序之间的延迟较大,则可以正常工作。如果它很小,它不会:“致命错误:所有goroutine都处于休眠-死锁状态!”被触发,程序崩溃。我猜(?)死锁是由以下原因造成的:(1)监视器充斥着新的价格信息(并且未能及时分析这些信息);或(2)主功能被监视器的消息所淹没。在主函数将新价格附加到一个切片上的同时,监视器正在遍历它,这一事实可能也有一些缺点。如何解决这个问题?在阅读其他文章时,我认为“select”语句是一种神奇的治疗方法

go - 为什么 Goroutines 的执行时间相差很大?

我只是在测量一组goroutine的执行时间。这意味着:我开始测量,然后启动20个goroutine并在它们完成后立即停止测量。我重复该过程大约4次,然后比较4次执行时间。有时,这些执行时间会有很大差异:20个goroutine的第一次运行:1.2毫秒20个协程的第2次运行:1.9毫秒20个协程的第3次运行:1.4毫秒20个goroutine的第4次运行:17.0毫秒!为什么有时差异如此之大?有什么办法可以避免吗? 最佳答案 Whydoesitsometimesdiffersosignificantly?执行时间在某些时候总是不可预

go - 如何从 channel 接收直到它在 GO 中具有值

一个函数有一个循环,它在其中调用一个go例程,并将一个channel传递给它。在此之后,我尝试从channel接收直到它有值。go函数在每次调用时在channel中传递值。我的channel无限运行。func(m*StreamsDAO)FindOutput(输入模型.输入)([]模型.输出,错误){//SOMECODEvarchanNumberint=(input.EndTime-input.StartTime)/60outputChan:=make(chanmodel.Output,chanNumber)fori:=input.StartTime;ifuncForEachSlide(

go - 为什么当我在发件人端关闭时仍然会出现 "send on closed channel" panic ?

我有一个stopChan来通知发送者关闭channel,还有一个sync.Once来确保只有一个发送者可以关闭channel,但我仍然收到“发送在关闭的channel上”panic,为什么?funcmuitiSenderClose(){constSenderNum=3wg:=sync.WaitGroup{}wg.Add(SenderNum)intChan:=make(chanint)stopChan:=make(chanstruct{})once:=sync.Once{}fori:=0;i10{close(stopChan)fmt.Printf("Got%d\n",sum)break}

go - 我想在 goroutines 之间通信并无限期地阻塞主线程

我如何阻止mainfunc并允许goroutines通过channel进行通信以下代码示例会抛出错误0fatalerror:所有goroutines都睡着了-死锁!packagemainimport("fmt""time")funcmain(){ch:=make(chanint)gofunc(){value:= 最佳答案 我想你想打印所有值[0:99]。然后你需要在第一个goroutine中循环。另外,你需要传递信号来打破循环funcmain(){ch:=make(chanint)stopProgram:=make(chanbool

go - 不明显的死锁情况

您能解释一下为什么会出现这种僵局吗?packagemainimport("sync""fmt""runtime")funcmain(){m:=sync.RWMutex{}gofunc(){m.RLock()runtime.Gosched()m.RLock()m.RUnlock()m.RUnlock()}()runtime.Gosched()m.Lock()m.Unlock()fmt.Println("works")}我不太清楚为什么这种死锁总是经常发生。这会不会是调度器的一个怪癖? 最佳答案 来自RWMutex文档:Ifagorou

go - 使用for循环遍历 channel 时出现Goroutine死锁

我正在尝试练习goroutine和channel,我在调用gorouting和传递channel时遇到问题。goroutine将数据推送到channel中,然后主线程将打印元素。我已经使用for循环来打印内容但是得到了。fatalerror:allgoroutinesareasleep-deadlock!21goroutine1[chanreceive]:main.main()packagemainimport"fmt"funcsmallThread(aint,cchanint){c编辑:使用WaitGroup:funcsmallThread(aint,cchanint,w*sync.